﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Ext.Net;
using FastTravel.BusinessLogic;
using FastTravel.DB;
using FastTravel.DB.DTO;
using FastTravel.DB.Enums;
using FastTravel.DB.Helpers;

namespace FastTravel.IntranetWeb
{
	/// <summary>
	/// Страница мастера добавления нового заказа
	/// </summary>
	public partial class OrderAdd : BasePage
	{

		/// <summary>
		/// Загрузка страницы
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		protected void Page_Load(object sender, EventArgs e)
		{
			if (!ExtNet.IsAjaxRequest)
			{
				// Заполняем дроп-даун семейного положения клиента

				Type marritalType = typeof(MarritalStatus);
				Dictionary<int, string> statusList = EnumMetadataConverter.GetListItems(marritalType);

				var dropdawnList = new List<object>();

				foreach (var item in statusList)
				{
					dropdawnList.Add(new { Text = item.Value, Value = item.Key });
				}
				this.storeMarritialStatus.DataSource = dropdawnList;
				this.storeMarritialStatus.DataBind();

			}
		}

		/// <summary>
		/// Переход на следующий шаг мастера
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		protected void NextClick(object sender, DirectEventArgs e)
		{
			int index = int.Parse(e.ExtraParams["index"]);
			var customerForOrder = (List<Customer>) Session["CustomersInOrder"];
			
			if ((index + 1) < this.wizardOrder.Items.Count)
			{
				switch (index)
				{
					// шаг 1
					case 0:
						
						break;
					
					// шаг 2
					case 1:
						BindPriceGrid();

						break;
					
					// шаг 3
					case 3:
						break;


					default:
						break;
				}
				
				// Проверка шага 1. 
				// Проверяем, выбраны ли клиенты для перехода на следующий шаг

				if (customerForOrder == null)
				{
						ExtNet.Msg.Notify("Внимание!", "Выберите хотя бы одного клиента!").Show();
						wizardOrder.ActiveIndex = 0;
						this.CheckButtons();
						return;
				}
				else
				{
					if (customerForOrder.Count <= 0)
					{
						ExtNet.Msg.Notify("Внимание!", "Выберите хотя бы одного клиента!").Show();
						wizardOrder.ActiveIndex = 0;
						this.CheckButtons();
						return;
					}	
				}
				
				
				this.wizardOrder.ActiveIndex = index + 1;
			}

			this.CheckButtons();
		}

		/// <summary>
		/// Заполнение таблицы со стоимостью 
		/// </summary>
		private void BindPriceGrid()
		{
		}

		/// <summary>
		/// Переход на предыдущий шаг мастера
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		protected void PrevClick(object sender, DirectEventArgs e)
		{
			int index = int.Parse(e.ExtraParams["index"]);

			if ((index - 1) >= 0)
			{
				this.wizardOrder.ActiveIndex = index - 1;
			}

			this.CheckButtons();
		}

		/// <summary>
		/// Определение доступности кнопок мастера 
		/// (на первом и последнем шаге соответствующие кнопки должны быть недоступны)
		/// </summary>
		private void CheckButtons()
		{
			int index = this.wizardOrder.ActiveIndex;

			this.btnNext.Disabled = index == (this.wizardOrder.Items.Count - 1);
			this.btnPrev.Disabled = index == 0;
		}

		/// <summary>
		/// Отображение окна для создания нового клиента
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		protected void BtnCustomerAdd(object  sender, DirectEventArgs e)
		{
			var win = new Window
			          	{
			          		ID = "winCustomerAdd",
			          		Title = "Новый клиент",
			          		Width = Unit.Pixel(600),
			          		Height = Unit.Pixel(650),
			          		Modal = true,
			          		Collapsible = true,
			          		Maximizable = true,
			          		Hidden = true
			          	};

			win.AutoLoad.Url = urlCustomerAdd;
			win.AutoLoad.Mode = LoadMode.IFrame;
			win.CloseAction = CloseAction.Close;
			win.Closable = true;
			win.Listeners.Close.Handler = "FastTravel.IntranetWeb.DoCloseCustomerWindow();";
			win.Closable = true;
			win.Render(this.Form);
			win.Show();
		}

		/// <summary>
		/// Обновление таблицы с клиентами после закрытия окна добавления клиентов
		/// </summary>
		[DirectMethod]
		public void DoCloseCustomerWindow()
		{
			grdCustomer.Reload();
			toolbarCustomerBottomPaging.SetPageIndex(0);
		}

		/// <summary>
		/// События таблицы клиентов
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e">Аргумент с командами</param>
		public void CustomerGridAction(object sender, DirectEventArgs e)
		{
			int id = int.Parse(e.ExtraParams["id"]);
			switch (e.ExtraParams["command"])
			{
				case "Edit":
					//ShowEditWindow(id);
					break;
				case "Delete":
					CustomerManager.Delete(id);
					if (BusinessLogicManager.TryCommit())
					{
						ExtNet.Msg.Notify("Сообщение", "Клиент удален!").Show();
						grdCustomer.Reload();
					}
					else
					{
						ExtNet.Msg.Notify("Ошибка", "Клиент не был удален!").Show();
					}
					break;
			}
		}

		/// <summary>
		/// Получение списка клиентов
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e">Параметры запроса</param>
		protected void CustomerStoreRefresh(object sender, StoreRefreshDataEventArgs e)
		{
			int totalCount = 0;

			string filterByFirstName = txtCustomerFilterFirstName.Text == "" ? string.Empty : txtCustomerFilterFirstName.Text;
			string filterByLastName = txtCustomerFilterLastName.Text == "" ? string.Empty : txtCustomerFilterLastName.Text;
			string filterByMiddleName = txtCustomerFilterMiddleName.Text == "" ? string.Empty : txtCustomerFilterMiddleName.Text;

			var customerList = CustomerManager.GetPage(e.Start, e.Limit, e.Sort, e.Dir.ToString(), 
				false, filterByFirstName, filterByLastName, filterByMiddleName, out totalCount);

			e.Total = totalCount;

			this.grdCustomer.GetStore().DataSource = customerList;
		}

		/// <summary>
		/// Обработчик кнопки поиска клиентов
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		protected void BtnSearchCustomerClick(object sender, DirectEventArgs e)
		{
			grdCustomer.Reload();
			toolbarCustomerBottomPaging.SetPageIndex(0);
		}
		
		/// <summary>
		/// Выбор клиента для оформления заказа
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		protected void BtnChooseCustomerClick(object sender, DirectEventArgs e)
		{
			int id = int.Parse(e.ExtraParams["id"]);
			if (id != -1)
			{
				Customer customer = CustomerManager.Get(id);
			
				var list = (List<Customer>)Session["CustomersInOrder"];
				if (list == null)
				{
					var listOfCustomer = new List<Customer> {customer};
					Session["CustomersInOrder"] = listOfCustomer;
				}
				else
				{
					if (list.Any(c => c.ID != customer.ID))
					{
						list.Add(customer);
						Session["CustomersInOrder"] = list;
					}
				}
				
				grdCustomerInOrder.Reload();
			}
		}

		/// <summary>
		/// Убрать клиента из списка оформления заказа
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		protected void BtnRemoveCustomerClick(object sender, DirectEventArgs e)
		{
			int id = int.Parse(e.ExtraParams["id"]);
			if (id != -1)
			{
				List<Customer> list = (List<Customer>)Session["CustomersInOrder"];
				if (list != null)
				{
					if (list.Count == 1)
					{
						Session["CustomersInOrder"] = null;
					}
					else
					{
						for (int i = 0; i < list.Count(); i++)
						{
							if (list[i].ID == id)
							{
								list.Remove(list[i]);
							}
						}
						Session["CustomersInOrder"] = list;
					}
				}
				grdCustomerInOrder.Reload();
			}
		}

		/// <summary>
		/// Убрать всех клиентов из списка для оформления заказа
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		protected void BtnRemoveAllCustomerClick(object sender, DirectEventArgs e)
		{
			Session["CustomersInOrder"] = null;
			grdCustomerInOrder.Reload();
		}

		/// <summary>
		/// Источник данных для таблицы выбранных клиентов для оформления (источник для обновления)
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		protected void StoreChoosedCustomersRefreshData(object sender, StoreRefreshDataEventArgs e)
		{
			List<Customer> list = (List<Customer>)Session["CustomersInOrder"] ?? new List<Customer>();
			this.grdCustomerInOrder.GetStore().DataSource = list;
		}

		/// <summary>
		/// Отображение детальной информации
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e">Аргумент с параметром</param>
		protected void CustomerRowSelected(object sender, DirectEventArgs e)
		{
		}
	}
}